package com.cy.pj.notice.dao;

import com.cy.pj.notice.pojo.SysNotice;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;

import java.io.IOException;
import java.util.List;

/**
 * 在SpringBoot工程中基于MyBatis实现与数据库交互时，
 * 一般首先要定义一个数据层接口，
 * 并通过@Mapper注解对接口进行描述，
 * 系统启动时，会对启动类所在包及子包中的类进行扫描，
 * 假如发现接口上有@Mapper注解（MyBatis提供），
 * 系统底层会基于接口创建其实现类（借助反射包中的Proxy类进项创建），
 * 在实现类的内部，底层会基于SqlSession对象实现数据访问和操作
 */
//@Component
@Mapper
public interface SysNoticeDao {
    /**
     * 基于条件查询公告信息
     * @param notice 封装查询参数
     * @return 基于查询条件查询到的结果
     */
    List<SysNotice> selectNotices(SysNotice notice) throws IOException;

    /**
     * 基于id删除公告信息
     * @param id 公告唯一表示id
     * @return 基于id删除的公告信息的行数
     */
    int deleteNotice(Long... id);

    /**
     * 持久化Notice对象数据
     * @param notice (封装了要写入的数据)
     * @return 返回写入的行数
     */
    int insertNotice(SysNotice notice);

    /**
     * 基于id查询notice对象
     * @param id 公告唯一标识id
     * @return 基于id查询到的结果
     * 建议：简单SQL映射语句可以直接写在接口方法上
     * 复杂SQL映射语句写在映射文件
     */
    @Select("select * from sys_notices where id = #{id}")
    SysNotice selectById(@Param("id") Long id); // @Param()兼容低版本IDEA

    /**
     * 持久化notice对象数据
     * @param notice (封装了要写入的数据)
     * @return 返回更新的行数
     */
    int updateNotice(SysNotice notice);

}
